package arrlearn

import "fmt"

func CreateArr() {
	//go语言中的数组和python的list可以对应起来理解，slice和python的list更像
	//静态语言中的数组：1.大小确定 2.类型一致

	//var courses [10]string //只声明
	//var courses [5]string =[5]string{"python", "golang", "django"} //声明并初始化
	//var courses = [5]string{"python", "golang", "django"} //声明并初始化

	//初始化的时候，可以不填满，go会用类型的默认值填，这里字符串的默认值是空串
	courses := [5]string{"python", "golang", "django"} //声明并初始化
	fmt.Println("courses([5]string{\"python\", \"golang\", \"django\"})=", courses)

	//1.修改值，取值；（不支持）删除值，（不支持）添加值；数组一开始就要指定大小
	//取值
	course1 := courses[0]
	fmt.Println(course1)
	//修改值
	courses[0] = "scarpy"
	fmt.Println(courses[0])

	//字符本质上是int,一般是用rune来声明
	var c = [5]int{'a', 'A', 'b', 'B'}
	fmt.Println("c([5]int{'a', 'A', 'b', 'B'})=", c)

	//数组的另一种创建方式
	//...在不同的场景下有不同的含义
	scores := [...]int{10, 90, 86, 100}
	fmt.Println("len(scores([...]int{10, 90, 86, 100}))=", len(scores))

	//下面声明的意思是，数组有5个元素，其中第5个值设置为100，其他位置用0填充
	d := [5]int{4: 100}
	fmt.Println("d([5]int{4: 100})=", d)

	e := [...]int{0: 1, 4: 1, 9: 100}
	fmt.Println("len(e)=", len(e), "e([...]int{0:1, 4:1,9:100})=", e)

	//数组切片
	fmt.Println("数据切片e[:6]=", e[:6])

	//这样声明的是切片
	//f := []int{1, 2, 3}
	//fmt.Printf("%T \n", f)

}

func OperareArr() {
	//数组操作
	courses := [5]string{"python", "golang", "django"} //声明并初始化
	fmt.Println("courses=", courses)

	//1.求数组长度
	fmt.Println("len(courses)=", len(courses))

	//2.数组遍历
	for i, v := range courses {
		fmt.Printf("第%d门课程是：%s \n", i, v)
	}

	//使用for range 求和
	f := [...]int{0: 1, 4: 3, 9: 100}
	sum := 0
	for _, v := range f {
		sum += v
	}
	fmt.Println("f=", f)
	fmt.Println("for range sum(f)=", sum)

	//使用for语句遍历f
	sum = 0
	for i := 0; i < len(f); i++ {
		sum += f[i]
	}
	fmt.Println("for loop sum(f)=", sum)

}

func printArray(toPrint [3]string) {
	toPrint[0] = "test0"
	fmt.Println("在函数体内部改变数组的值：", toPrint)
}

func ArrIsValueType() {
	//go中的数组是值类型
	var courses1 = [3]string{"python1", "golang1", "django1"}
	courses2 := [...]string{"python2", "golang2", "django2", "python+go", "scrapy2"}
	//courses1和courses2应该是同一种类型，都是数组类型（java,c中是同一种）
	//go语言中，courses1和courses2都是数组，但不是同一种类型
	fmt.Printf("type of couses1 = %T \n", courses1)
	fmt.Printf("type of couses2 = %T \n", courses2)
	//长度不一样的数组类型是不一样的。在go中，数组长度也是类型的一部分
	//正是因为这个原因，在go中，函数传递参数的时候，如果传递的是数组，实际调用的时候是值传递
	printArray(courses1)
	fmt.Println("查看原数组：", courses1)
}
